﻿using System;
using System.Collections.Generic;
using System.Text;

namespace LK.Math
{
    public partial class Bits
    {
		static byte[] _lzcnt8arr=new byte[] { 
			8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
			2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
			1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		};
		static public int LeftZeroCount8(byte d) {
			return _lzcnt8arr[d];
		}
		/// <summary>
		/// 获取ulong数值高位连续为0的比特数量
		/// </summary>
		/// <param name="i">ulong型数值</param>
		/// <returns>获取到的数量</returns>
		static public int LeftZeroCount64(ulong i)
		{
			if (i < 0x100000000)
			{
				if (i < 0x10000)
				{
					if (i < 0x100) return 56 + LeftZeroCount8((byte)i); return 48 + LeftZeroCount8((byte)(i >> 8));
				}
				if (i < 0x1000000) return 40 + LeftZeroCount8((byte)(i >> 16)); return 32 + LeftZeroCount8((byte)(i >> 24));
			}
			if (i < 0x1000000000000)
			{
				if (i < 0x10000000000) return 24 + LeftZeroCount8((byte)(i >> 32)); return 16 + LeftZeroCount8((byte)(i >> 40));
			}
			if (i < 0x100000000000000) return 8 + LeftZeroCount8((byte)(i >> 48)); return LeftZeroCount8((byte)(i >> 56));
		}

	}
}
